#ifndef __W25QXX_H
#define __W25QXX_H

#include "stm32f7xx.h"                  // Device header
#include "sys.h"

//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK STM32开发板 
//W25QXX QPI模式驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2016/7/18
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved									  
////////////////////////////////////////////////////////////////////////////////// 	

//W25X系列/Q系列芯片列表	   
//W25Q80  ID  0XEF13
//W25Q16  ID  0XEF14
//W25Q32  ID  0XEF15
//W25Q64  ID  0XEF16	
//W25Q128 ID  0XEF17	
//W25Q256 ID  0XEF18
#define W25Q80 	0XEF13 	
#define W25Q16 	0XEF14
#define W25Q32 	0XEF15
#define W25Q64 	0XEF16
#define W25Q128	0XEF17
#define W25Q256 0XEFAA   //--这里的256实际上是1G 的容量

extern u16 W25QXX_TYPE;					//定义W25QXX芯片型号		   
 
////////////////////////////////////////////////////////////////////////////////// 
//指令表
#define W25X_WriteEnable		0x06    //
#define W25X_WriteDisable		0x04 //
#define W25X_ReadStatusReg1		0x05 //
#define W25N_PR_Add					0xA0//
#define W25N_CR_Add					0xB0//
#define W25N_SR_Add					0xC0//
#define W25X_ReadStatusReg2		0x0f//

#define W25X_WriteStatusReg1    0x01// 
#define W25X_WriteStatusReg2    0x1f// 

#define W25N_Page_W 			0x10
#define W25N_Page_R				0x13
#define W25X_ReadData			0x03 //
#define W25X_FastReadData		0x6B //
#define W25X_FastReadDual		0x3B 
#define W25X_PageProgram		0x32 //
#define W25X_BlockErase			0xD8 //
#define W25X_SectorErase		0x20 
#define W25X_ChipErase			0xC7 
#define W25X_PowerDown			0xB9 
#define W25X_ReleasePowerDown	0xAB 
#define W25X_DeviceID			0xAB 
#define W25X_ManufactDeviceID	0x90 
#define W25X_JedecDeviceID		0x9F 
#define W25X_Enable4ByteAddr    0xB7
#define W25X_Exit4ByteAddr      0xE9
#define W25X_SetReadParam		0xC0 
#define W25X_EnterQPIMode       0x38
#define W25X_ExitQPIMode        0xFF

void W25QXX_Init(void);					//初始化W25QXX
void W25QXX_Qspi_Enable(void);			//使能QSPI模式
void W25QXX_Qspi_Disable(void);			//关闭QSPI模式
u16  W25QXX_ReadID(void);  	    		//读取FLASH ID
u8 W25QXX_ReadSR(u8 regno);             //读取状态寄存器 
void W25QXX_4ByteAddr_Enable(void);     //使能4字节地址模式
void W25QXX_Write_SR(u8 regno,u8 sr);   //写状态寄存器
void W25QXX_Write_Enable(void);  		//写使能 
void W25QXX_Write_Disable(void);		//写保护
//void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite);//写flash,不校验
void W25QXX_Write_NoCheck(u8* pBuffer,u32 PageAddr,u16 CloAddr,u32 NumByteToWrite);//写flash,不校验   
//void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u32 NumByteToRead);   //读取flash
void W25QXX_Read(u8* pBuffer,u32 PageAddr,u16 CloAddr,u32 NumByteToRead);  //读取flash
void W25QXX_Write(u8* pBuffer,u32 PageAddr,u16 CloAddr ,u32 NumByteToWrite);//写入flash
//void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite);//写入flash
void W25QXX_Erase_Chip(void);    	  	//整片擦除
void W25QXX_Erase_Sector(u16 Dst_Addr);	//扇区擦除
void W25QXX_Wait_Busy(void);           	//
void DataToBuff(u8* pBuffer,u16 Addr,u32 NumByteToWrite);  //数据搬运到缓冲区
void Flash_Program(u16 Addr);  //数据搬运到缓冲区
void DataToBuff_Len(u8* pBuffer,u16 Addr,u32 NumByteToWrite);  //数据搬运到缓冲区
#endif
